
#include "gtest/gtest.h"
#include "../src/libraries/robocup/jugador.h"
#include "../src/libraries/robocup/funciones.h"

class JugadorDatosSeeTest : public testing::Test
{
public:
    string see;
    Jugador jugador;

    virtual void SetUp()
    {
        see="(see 0 ((flag c) 38.1 -23) ((flag c b) 39.6 28) ((flag r t) 100.5 -29 12 6) ((flag r b) 89.1 12) ((flag g r b) 88.2 -5) ((goal r) 89.1 -9) ((flag g r t) 90 -14) ((flag p r b) 71.5 4) ((flag p r c) 72.2 -11) ((flag p r t) 79 -26) ((ball) 36.6 -23 0 0) ((line r) 87.4 89))";  
        jugador.interpretar(see);
    }
    virtual void TearDown()
    {
    }
};

class JugadorDatosSenseTest : public testing::Test
{
public:
    string sense;
    Jugador jugador;

    virtual void SetUp()
    {
        sense="(sense_body 0 (view_mode high normal) (stamina 8000 1) (speed 23) (kick 12) (dash 70) (turn 35) (say 1))";
        jugador.interpretar(sense);
    }
    virtual void TearDown()
    {
    }
};
class JugadorDatosHearTest : public testing::Test
{
public:
    string hear;
    Jugador jugador;

    virtual void SetUp()
    {
        hear="(hear 0 referee kick_off_l)";
        jugador.interpretar(hear);
    }
    virtual void TearDown()
    {
    }
};

class JugadorDatosInitTest : public testing::Test
{
public:
    string init,init2;
    Jugador jugadorl,jugadorr;

    virtual void SetUp()
    {
        init="(init l 1 before_kick_off)";
        init2="(init t 11 before_kick_off)"; //VALOR INCORRECTO DE LADO lo guardamos como DESCONOCIDO
        jugadorl.interpretar(init);
        jugadorr.interpretar(init2);
    }
    virtual void TearDown()
    {
    }
};

class JugadorComprobarPelotaTest : public testing::Test
{
public:
    string see,see2,see3,see4;
    Jugador jugador1,jugador2,jugador3,jugador4;

    virtual void SetUp()
    {
        see= "(see 0 ((flag c) 38.1 -23) ((flag c b) 39.6 28) ((flag r t) 100.5 -29 12 6) ((flag r b) 89.1 12) ((flag g r b) 88.2 -5) ((goal r) 89.1 -9) ((flag g r t) 90 -14) ((flag p r b) 71.5 4) ((flag p r c) 72.2 -11) ((flag p r t) 79 -26) ((ball) 36.6 -23 0 0) ((line r) 87.4 89))";
        see2="(see 0 ((flag c) 38.1 -23) ((flag c b) 39.6 28) ((flag r t) 100.5 -29 12 6) ((flag r b) 89.1 12) ((flag g r b) 88.2 -5) ((goal r) 89.1 -9) ((flag g r t) 90 -14) ((flag p r b) 71.5 4) ((flag p r c) 72.2 -11) ((flag p r t) 79 -26) ((line r) 87.4 89))";
        see3="(init l 1 before_kick_off)";
        see4="(see 0)";
        jugador1.interpretar(see);
        jugador2.interpretar(see2);
        jugador3.interpretar(see3);
        jugador4.interpretar(see4);

    }
    virtual void TearDown()
    {
    }
};

class JugadorsetPosicionTest : public testing::Test
{
public:
    string see,see2,see3,see4;
    Jugador jugador1,jugador2,jugador3,jugador4;

    virtual void SetUp()
    {
        see= "(see 0 ((flag h) 62.2 -33) ((flag c b) 51.9 0) ((flag r t) 125.2 -33) ((flag r b) 104.6 0) ((Flag) 0.5 179) ((flag g r b) 107.8 -14) ((goal r) 109.9 -18) ((flag g r t) 112.2 -21) ((flag p r b) 89.1 -8) ((flag p r c) 94.6 -21) ((flag p r t) 103.5 -31) ((flag p l b) 21.1 -40 0 0) ((ball) 60.3 -33) ((line r) 104.6 89))";
        see2="(see 76 ((flag c b) 28.5 -19 0 0) ((flag r b) 79.8 -31) ((flag p r b) 63.4 -42) ((line b) 14.4 -38))";
        see3="(see 73 ((flag c) 37 21) ((flag c t) 64.7 -1) ((flag r t) 99.5 27) ((flag g r t) 85.6 41) ((flag p r c) 68 42) ((flag p r t) 77.5 28) ((flag p l t) 46.1 -37) ((ball) 36.6 21) ((player Grupo_3 3) 16.4 -36 -0 0) ((player Grupo_3) 33.1 -31) ((player) 49.4 -26) ((line t) 65.4 63))";
        see4="(see 64 ((flag l t) 64.1 16) ((flag g l b) 31.2 -15 -0 0) ((goal l) 35.9 -6 -0 0) ((flag g l t) 40.9 0) ((flag p l b) 10.2 -22 -0 0) ((flag p l c) 26.6 19) ((flag p l t) 46.1 28) ((player Grupo_3 1) 30 3 -0 0) ((player Grupo_3 3) 16.4 29 -0 0) ((player Grupo_3 4) 33.1 34 -0 0) ((player) 49.4 39) ((line l) 40 39))";
        jugador1.interpretar(see);
        jugador1.setPosicion(see);
        jugador2.interpretar(see2);
        jugador2.setPosicion(see2);
        jugador3.interpretar(see3);
        jugador3.setPosicion(see3);
        jugador4.interpretar(see4);
        jugador4.setPosicion(see4);

    }
    virtual void TearDown()
    {
    }
};
TEST_F(JugadorDatosSeeTest,testIntroduccionDatoSee)
{
    EXPECT_EQ(jugador.datos.Seeinst["flag c"].getDist(), 38.1);
    EXPECT_EQ(jugador.datos.Seeinst["flag c"].getDir(), -23);
    EXPECT_EQ(jugador.datos.Seeinst["flag c b"].getDist(), 39.6);
    EXPECT_EQ(jugador.datos.Seeinst["flag c b"].getDir(), 28);
    EXPECT_EQ(jugador.datos.Seeinst["flag r t"].getDist(), 100.5);
    EXPECT_EQ(jugador.datos.Seeinst["flag r t"].getDir(), -29);
    EXPECT_EQ(jugador.datos.Seeinst["flag r t"].getDistchng(), 12);
    EXPECT_EQ(jugador.datos.Seeinst["flag r t"].getDirchng(), 6);
}

TEST_F(JugadorDatosSenseTest,testIntroduccionDatosSense)
{

    EXPECT_EQ(jugador.datos.Senseinst["stamina"].getValue1(),8000);
    EXPECT_EQ(jugador.datos.Senseinst["stamina"].getValue2(),1);
    EXPECT_EQ(jugador.datos.Senseinst["speed"].getValue1(),23);
    EXPECT_EQ(jugador.datos.Senseinst["kick"].getValue1(),12);
    EXPECT_EQ(jugador.datos.Senseinst["dash"].getValue1(),70);
    EXPECT_EQ(jugador.datos.Senseinst["turn"].getValue1(),35);
    EXPECT_EQ(jugador.datos.Senseinst["say"].getValue1(),1);
}

TEST_F(JugadorDatosHearTest,testIntroduccionDatosHear)
{
    EXPECT_EQ(jugador.datos.Hearinst["referee"].getinstruction(),"kick_off");
    EXPECT_EQ(jugador.datos.Hearinst["referee"].getside(),"l");
}

TEST_F(JugadorDatosInitTest,testIntroduccionDatosHear)
{
    EXPECT_EQ(jugadorl.datos.getNumero(),1);
    EXPECT_EQ(jugadorl.datos.getSide(),"l");
    EXPECT_EQ(jugadorr.datos.getNumero(),11);
    EXPECT_EQ(jugadorr.datos.getSide(),"desconocido");
}

TEST_F(JugadorComprobarPelotaTest,testComprobarPelota)
{
    EXPECT_EQ(jugador1.veoPelota,true);
    EXPECT_EQ(jugador2.veoPelota,false);
    EXPECT_EQ(jugador3.veoPelota,false);
    EXPECT_EQ(jugador4.veoPelota,false);
    //EXPECT_EQ(jugador1.buscarPelota(),true);
   // EXPECT_EQ(jugador2.buscarPelota(),false);
}

TEST_F(JugadorsetPosicionTest,testComprobarPosicion)
{
    EXPECT_EQ(jugador1.posicion.getX(),-52);
    EXPECT_EQ(jugador1.posicion.getY(),34);
    EXPECT_EQ(jugador2.posicion.getX(),-27);
    EXPECT_EQ(jugador2.posicion.getY(),25);
    EXPECT_EQ(jugador3.posicion.getX(),-27);
    EXPECT_EQ(jugador3.posicion.getY(),25);
    EXPECT_EQ(jugador4.posicion.getX(),-27);
    EXPECT_EQ(jugador4.posicion.getY(),25);
}

TEST_F(JugadorsetPosicionTest,testComprobarPosicionPelota)
{
    EXPECT_EQ(posicionPelota(jugador1).getX(),0);
    EXPECT_EQ(posicionPelota(jugador1).getY(),0);
}

int main(int argc, char **argv)
{
  ::testing::InitGoogleTest(&argc, argv);
  return RUN_ALL_TESTS();
}

